import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class RedisHash {
    public static void test1(Jedis jedis) {
        System.out.println("hset 和 hget 和 hexists 和 hdel");
        jedis.flushAll();

        Map<String,String> map = new HashMap<>();
        map.put("field1", "111");
        map.put("field2", "222");
        map.put("field3", "333");
        map.put("field4", "444");
        map.put("field5", "555");
        map.put("field6", "666");

        jedis.hset("key1", map);

        String value1 = jedis.hget("key1", "field1");
        String value2 = jedis.hget("key1", "field2");
        System.out.println(value1 + " 和 " + value2);

        // 判断key对应的哈希表中时候存在 field 这个字段
        boolean hexists = jedis.hexists("key1", "field4");
        System.out.println(hexists);

        // 删除key中指定的 field 这个对应的字段和其对应的 value值
        long hdel = jedis.hdel("key1", "field4");
        System.out.println(hdel);
    }

    public static void test2(Jedis jedis) {
        System.out.println("hkeys 和 hvals");
        jedis.flushAll();

        Map<String,String> map = new HashMap<>();
        map.put("field1", "111");
        map.put("field2", "222");
        map.put("field3", "333");
        map.put("field4", "444");
        map.put("field5", "555");
        map.put("field6", "666");

        jedis.hset("key1", map);

        // 获取key对应的所有 field
        Set<String> key1 = jedis.hkeys("key1");
        System.out.println(key1);

        // 获取key对应的所有value值
        List<String> key2 = jedis.hvals("key1");
        System.out.println(key2);
    }

    public static void test3(Jedis jedis) {
        System.out.println("hgetall 和 hmget");
        jedis.flushAll();

        Map<String,String> map = new HashMap<>();
        map.put("field1", "111");
        map.put("field2", "222");
        map.put("field3", "333");
        map.put("field4", "444");
        map.put("field5", "555");
        map.put("field6", "666");

        jedis.hset("key1", map);

        // 获取 key 中的所有的 field 和 value值
        Map<String, String> key1 = jedis.hgetAll("key1");
        System.out.println(key1);

        // 获取 key 中的对应的所有field对应的value值
        List<String> hmget = jedis.hmget("key1", "field1", "field2", "field3");
        System.out.println(hmget);
    }

    public static void test4(Jedis jedis) {
        System.out.println("hlen 和 hincrby 和 hincrbyfloat");
        jedis.flushAll();

        Map<String,String> map = new HashMap<>();
        map.put("field1", "111");
        map.put("field2", "222");
        map.put("field3", "333");
        map.put("field4", "444");
        map.put("field5", "555");
        map.put("field6", "666");

        jedis.hset("key1", map);

        // 获取hash 中元素的个数
        long len = jedis.hlen("key1");

        // 将这个 field 对应的value值进行加上 这里给定的value值
        jedis.hincrBy("key1", "field1", 2);

        // 将这个 field 对应的value值进行加上 这里给定的value值，可以是小数
        jedis.hincrByFloat("key1", "field2", 5.5);

        List<String> hmget = jedis.hmget("key1", "field1", "field2", "field3");

        System.out.println(hmget);
    }

    public static void main(String[] args) {
        JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");

        try (Jedis jedis = jedisPool.getResource()) {
            test1(jedis);
            test2(jedis);
            test3(jedis);
        }
    }
}
